home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / misc / pdflib / p_hyper.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  2KB  |  93 lines

  1. /* p_hyper.c
  2.  * Copyright (C) 1997-98 Thomas Merz. All rights reserved.
  3.  *
  4.  * PDFlib routines for hypertext stuff, e.g. bookmarks
  5.  */
  6.  
  7. /* 
  8.  * Restrictions: bookmarks cannot be nested 
  9.  */
  10.  
  11. #include "p_intern.h"
  12.  
  13. static void
  14. pdf_write_outline_dict(PDF *p, pdf_outline *out)
  15. {
  16.     pdf_begin_obj(p, out->self);
  17.     pdf_begin_dict(p);
  18.  
  19.     (void) fprintf(p->fp, "/Parent %ld 0 R\n", out->parent);
  20.  
  21.     /* outline destination */
  22.     (void) fprintf(p->fp, "/Dest [%ld 0 R /XYZ 0 0 0]\n", out->page);
  23.  
  24.     (void) fputs("/Title ", p->fp);    /* outline text */
  25.     pdf_quote_string(p, out->text);
  26.     (void) fputs("\n", p->fp);
  27.  
  28.     if (out->prev)
  29.     (void) fprintf(p->fp, "/Prev %ld 0 R\n", out->prev);
  30.     if (out->next)
  31.     (void) fprintf(p->fp, "/Next %ld 0 R\n", out->next);
  32.  
  33. #ifdef NOTYET
  34.     if (out->first) {
  35.     (void) fprintf(p->fp, "/First %ld 0 R\n", out->first);
  36.     (void) fprintf(p->fp, "/Last %ld 0 R\n", out->last);
  37.     (void) fprintf(p->fp, "/Count %d\n", out->count);
  38.     }
  39. #endif
  40.  
  41.     pdf_end_dict(p);
  42.     pdf_end_obj(p);
  43. }
  44.  
  45. void
  46. pdf_write_outlines(PDF *p)
  47. {
  48.     int i;
  49.  
  50.     if (p->outlines_id == 0)    /* no outlines, return */
  51.     return;
  52.  
  53.     pdf_begin_obj(p, p->outlines_id);
  54.     pdf_begin_dict(p);
  55.  
  56.     if (p->outline_count > 0) {
  57.     (void) fprintf(p->fp, "/Count %d\n", p->open_outlines);
  58.     (void) fprintf(p->fp, "/First %ld 0 R /Last %ld 0 R\n",
  59.         p->outlines[0].self, p->outlines[p->outline_count-1].self);
  60.         /*p->outlines[0].first.id, p->outlines[0].last.id);*/
  61.     }
  62.  
  63.     pdf_end_dict(p);
  64.     pdf_end_obj(p);
  65.  
  66.     for (i = 0; i < p->outline_count; i++)
  67.     pdf_write_outline_dict(p, &p->outlines[i]);
  68. }
  69.  
  70. /* add bookmark text with current page as destination */
  71. void
  72. PDF_add_outline(PDF *p, char *text)
  73. {
  74.     if (p->outline_count == 0)
  75.     p->outlines_id = pdf_alloc_id(p);
  76.  
  77.     p->open_outlines++;
  78.  
  79.     p->outlines[p->outline_count].text    = text;
  80.     p->outlines[p->outline_count].page    = p->pages[p->current_page];
  81.     p->outlines[p->outline_count].self    = pdf_alloc_id(p);
  82.     p->outlines[p->outline_count].parent= p->outlines_id;    /* HACK */
  83.  
  84.     if (p->outline_count > 0) {
  85.     p->outlines[p->outline_count].prev =
  86.         p->outlines[p->outline_count - 1].self;
  87.     p->outlines[p->outline_count - 1].next =
  88.         p->outlines[p->outline_count].self;
  89.     }
  90.  
  91.     p->outline_count++;
  92. }
  93.